#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/shm.h>
#include "cleanlog.h"

#define MAXBSIZE 128	//每行字节数
#define MAXLINE 300	//检查log文件时，如果行数超过MAXLINE，则清空，否则不清空
#define LOGLINE 50		//显示行数

int main(int argc, char *argv[]){
	FILE *log_fp;//log_fp表示用来log文件指针
	int i,sec,readline,line=0;
	char buf[LOGLINE][MAXBSIZE];
	struct stat sbuf;
	int fd, shmid;
	int *ptpflag = 0;//ptpflag用来标志ptp程序是否正在运行
	key_t shmkey;

	/* 使用共享存储的方式读写PTP_FLAG_FILE，尽可能避免读写冲突
	 * 与startup.cpp共享存储PTP_FLAG_FILE
	 * */
	//filefp转key
	shmkey = ftok(PTP_FLAG_FILE, 0);
	//shmget的第二个参数为0，表示正在引用一个现存的段（一个客户进程）
	if ((shmid = shmget(shmkey, 0, SHM_MODE)) < 0) perror("shmget error");
	//将共享存储段连接到它的地址空间中，shmat返回共享存储的指针，出错返回-1
	if ((ptpflag = (int *)shmat(shmid, 0, 0)) == (int *)-1) perror("shmat error");

	if(argc != 2){
		perror("usage: cleanlog n(seconds)");
		exit(1);
	}

	if((sec = atoi(argv[1]))==0){
		perror("please input a number for the second arguments");
		exit(1);
	}

	while(1){
		sleep(sec);//间隔sec秒清理log

		while(1) {
			if((log_fp=fopen(LOG_FILE,"r"))==NULL)
				perror("open file %s error", LOG_FILE);

			if (!fstat(fileno(log_fp), &sbuf))	{//获取文件信息
				printf("%lld\n",(long long)sbuf.st_size);
				fclose(log_fp);
				if((long long)sbuf.st_size < MAXBSIZE * MAXLINE){
					sleep(1);//如果log文件大小，则需要等待一段时间再读
				} else {
					break;
				}
			}
		}

		printf("log file size > %d\n", MAXBSIZE * MAXLINE);
		if((log_fp=fopen(LOG_FILE,"r"))==NULL){
			perror("open file %s error", LOG_FILE);
			continue;
		}

		/*记录下最后5LOGLINE行数据，在清空log文件之后马上写入最后这LOGLINE行数据*/
		fseek(log_fp, -4096, SEEK_END);
		while( line < LOGLINE && fgets(buf[line], MAXBSIZE, log_fp)) line++;
		fclose(log_fp);

		if(line >= LOGLINE){
			printf("log file line > %d\n", LOGLINE);
			if(*ptpflag == 1){
				printf("ptpflag == 1\n");
				 // 以下操作清空log文件
				if((log_fp=fopen(LOG_FILE,"w"))==NULL)
					perror("open file %s error", LOG_FILE);
				//fseek(log_fp, 0, SEEK_SET);
				for(i=0;i<LOGLINE;i++) //写入刚刚保存的LOGLINE行数据
					fputs(buf[i],log_fp);
				fclose(log_fp);
				line = 0;
			}
		}
	}
	//对共享存储段的操作结束，调用shmdt脱接该段。
	//注意，这并不从系统中删除其标识符以及其数据结构，该标识符仍然存在
	if (shmdt(ptpflag) < 0) perror("shmdt error");
	exit(0);
}

